#include "mainwidget.h"
#include "./ui_mainwidget.h"

#include "sessionfriendarea.h"

#include <QHBoxLayout>

MainWidget* MainWidget::instance = nullptr;

// 创建实例的过程
MainWidget *MainWidget::getInstance()
{
    if (instance == nullptr) {
        // 此处不传入参数，以桌面为父窗口
        // 由于此处的窗口是整个程序的主窗口，父窗口就设定为桌面，本身就是常规设定
        instance = new MainWidget();
    }
    return instance;
}

MainWidget::MainWidget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::MainWidget)
{
    ui->setupUi(this);

    this->setWindowTitle("我的聊天室");
    this->setWindowIcon(QIcon(":/resource/image/logo.png"));

    // 初始化主窗口的样式布局
    initMainWindow();
    // 初始化左侧窗口布局
    initLeftWindow();
    // 初始化中间窗口布局
    initMidWindow();
    // 初始化右侧窗口布局
    initRightWindow();

    // 初始化信号槽
    initSignalSlot();
}

MainWidget::~MainWidget()
{
    delete ui;
}

void MainWidget::initMainWindow()
{
    QHBoxLayout* layout = new QHBoxLayout();
    // Spacing 就是设置内部元素之间的间隔距离，设置为 0 表示紧挨着
    layout->setSpacing(0);

    // layout 里面的元素距离四个边界的距离
    layout->setContentsMargins(0,0,0,0);

    this->setLayout(layout);

    windowLeft = new QWidget();
    windowMid = new QWidget();
    windowRight = new QWidget();

    windowLeft->setFixedWidth(70);  // 左侧和中间的窗口宽度不随着界面的大小变化
    windowMid->setFixedWidth(310);
    windowRight->setMinimumWidth(500);  // 右侧的窗口是随着界面的变化而变化的

    // 通过qss对窗口的颜色进行设置，用颜色来区分窗口的左、中、右结构
    windowLeft->setStyleSheet("QWidget { background-color :rgb(46,46,46);}");
    windowMid->setStyleSheet("QWidget { background-color:rgb(247,247,247);}");
    windowRight->setStyleSheet("QWidget { background-color:rgb(245,245,245);}");


    layout->addWidget(windowLeft);
    layout->addWidget(windowMid);
    layout->addWidget(windowRight);


}

void MainWidget::initLeftWindow()
{
    // 左侧的窗口是一个垂直布局
    QVBoxLayout* layout = new QVBoxLayout();

    layout->setSpacing(20);                     // 设置控件之间的间距
    layout->setContentsMargins(0, 50, 0, 0);    // 左、上、右、下的距离

    windowLeft->setLayout(layout);

    // 添加用户头像
    userAvatar = new QPushButton();
    userAvatar->setFixedSize(45, 45);
    userAvatar->setIconSize(QSize(30, 30));
    userAvatar->setIcon(QIcon(":/resource/image/defaultAvatar.png"));
    userAvatar->setStyleSheet("QPushButton { background-color: transparent;}");
    layout->addWidget(userAvatar, 1, Qt::AlignTop | Qt::AlignHCenter);  //水平方向居中，垂直方向向上

    // 添加会话标签页按钮
    sessionTabBtn = new QPushButton();
    sessionTabBtn->setFixedSize(45, 45);
    sessionTabBtn->setIconSize(QSize(30, 30));
    sessionTabBtn->setIcon(QIcon(":/resource/image/session_active.png"));
    sessionTabBtn->setStyleSheet("QPushButton { background-color: transparent;}");
    layout->addWidget(sessionTabBtn, 1, Qt::AlignTop | Qt::AlignHCenter);


    // 添加好友标签页按钮
    friendTabBtn = new QPushButton();
    friendTabBtn->setFixedSize(45, 45);
    friendTabBtn->setIconSize(QSize(30, 30));
    friendTabBtn->setIcon(QIcon(":/resource/image/friend_inactive.png"));
    friendTabBtn->setStyleSheet("QPushButton { background-color: transparent;}");
    layout->addWidget(friendTabBtn, 1, Qt::AlignTop | Qt::AlignHCenter);


    // 添加好友申请标签页按钮
    applyTabBtn = new QPushButton();
    applyTabBtn->setFixedSize(45, 45);
    applyTabBtn->setIconSize(QSize(30, 30));
    applyTabBtn->setIcon(QIcon(":/resource/image/apply_inactive.png"));
    applyTabBtn->setStyleSheet("QPushButton { background-color: transparent;}");
    layout->addWidget(applyTabBtn, 1, Qt::AlignTop | Qt::AlignHCenter);


    // 实现四个标签按钮向上拉伸到一起
    layout->addStretch(20);




}

void MainWidget::initMidWindow()
{
    QGridLayout* layout = new QGridLayout();
    // 距离上方有 20px 的距离，另外三个方向不要边距
    layout->setContentsMargins(0, 20, 0, 0);
    // 设置内部元素控件之间的间距
    layout->setSpacing(0);
    windowMid->setLayout(layout);

    searchEdit = new QLineEdit();
    searchEdit->setFixedHeight(30);
    searchEdit->setPlaceholderText("搜索");
    searchEdit->setStyleSheet("QLineEdit{border-radius: 5px; background-color: rgb(226, 226, 226); padding-left: 5px;}");  // radius 表示圆角矩形

    addFriendBtn = new QPushButton();
    addFriendBtn->setFixedSize(30, 30);
    addFriendBtn->setIcon(QIcon(":/resource/image/cross.png"));
    QString style = "QPushButton { border-radius: 5px; background-color: rgb(226, 226, 226);}";
    style += " QPushButton: pressed { background-color: rgb(240, 240, 240); }";
    addFriendBtn->setStyleSheet(style);

    SessionFriendArea* sessionFriendArea = new SessionFriendArea();

    // 为了更灵活的控制边距, 只影响搜索框按钮这一行, 不影响下方列表这一行
    // 创建空白的 widget 填充到布局管理器中.
    QWidget* spacer1 = new QWidget();
    spacer1->setFixedWidth(10);
    QWidget* spacer2 = new QWidget();
    spacer2->setFixedWidth(10);
    QWidget* spacer3 = new QWidget();
    spacer3->setFixedWidth(10);

    layout->addWidget(spacer1, 0, 0);   // (0,0)表示行列，填充到网格布局中
    layout->addWidget(searchEdit, 0, 1);
    layout->addWidget(spacer2, 0, 2);
    layout->addWidget(addFriendBtn, 0, 3);
    layout->addWidget(spacer3, 0, 4);
    layout->addWidget(sessionFriendArea, 1, 0, 1, 5);   // 后面的两个参数 1、5 表示占据几行几列
}

void MainWidget::initRightWindow()
{

}

void MainWidget::initSignalSlot()
{
/*
 * ************************************************************
 *   连接信号槽，处理标签页按钮切换问题
 * ************************************************************
*/

    connect(sessionTabBtn, &QPushButton::clicked, this, &MainWidget::switchTabToSession);
    connect(friendTabBtn, &QPushButton::clicked, this, &MainWidget::switchTabToFriend);
    connect(applyTabBtn, &QPushButton::clicked, this, &MainWidget::switchTabToApply);

}

void MainWidget::switchTabToSession()
{
    // 1. 记录当前切换到了哪个标签页
    activeTab = SESSION_LIST;
    // 2. 调整图标显示情况，把会话图标设置为 active，其他两个图标设置为 inactive
    sessionTabBtn->setIcon(QIcon(":/resource/image/session_active.png"));
    friendTabBtn->setIcon(QIcon(":/resource/image/friend_inactive.png"));
    applyTabBtn->setIcon(QIcon(":/resource/image/apply_inactive.png"));

    // 3. 在主窗口的中间部分，加载会话列表数据
    this->loadSessionList();

}

void MainWidget::switchTabToFriend()
{
    // 1. 记录当前切换到了哪个标签页
    activeTab = FRIEND_LIST;
    // 2. 调整图标显示情况，把会话图标设置为 active，其他两个图标设置为 inactive
    friendTabBtn->setIcon(QIcon(":/resource/image/friend_active.png"));
    sessionTabBtn->setIcon(QIcon(":/resource/image/session_inactive.png"));
    applyTabBtn->setIcon(QIcon(":/resource/image/apply_inactive.png"));

    // 3. 在主窗口的中间部分，加载会话列表数据
    this->loadFriendList();

}

void MainWidget::switchTabToApply()
{
    // 1. 记录当前切换到了哪个标签页
    activeTab = APPLY_LIST;
    // 2. 调整图标显示情况，把会话图标设置为 active，其他两个图标设置为 inactive
    applyTabBtn->setIcon(QIcon(":/resource/image/apply_active.png"));
    friendTabBtn->setIcon(QIcon(":/resource/image/friend_inactive.png"));
    sessionTabBtn->setIcon(QIcon(":/resource/image/session_inactive.png"));

    // 3. 在主窗口的中间部分，加载会话列表数据
    this->loadApplyList();

}

// 加载会话列表
void MainWidget::loadSessionList()
{

}


// 加载好友列表
void MainWidget::loadFriendList()
{

}


// 加载好友申请列表
void MainWidget::loadApplyList()
{

}
